# -*- coding: utf-8 -*-
"""
Created on Mon Jul 26 21:21:38 2021

@author: lizhuang
"""
 # -*- coding: utf-8 -*-
"""
Created on Mon Jul 26 21:21:38 2021

@author: lizhuang
"""
import numpy as np
import matplotlib.pyplot as plt
#import sviewgui.sview as sv
import pandas as pd
import sys
import numpy as np
import scipy as sy
from scipy.optimize import root,fsolve
import pandas as pd
from matplotlib.pyplot import MultipleLocator
sys.path.append("../主界面")
from 绘图 import 绘图
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
class 曲柄滑块机构():
    def __init__(self,曲柄长度=175,连杆长度=1231,spm=30,能力发生位置=8,偏置=0, \
                 公称压力=2500):
        self.曲柄长度=曲柄长度
        self.连杆长度=连杆长度
        self.thea=np.pi
        self.初始=[0,(self.连杆长度-self.曲柄长度)]
        self.spm=spm#r/min
        self.角速度=spm*2*np.pi/60#弧度/s
        self.sf=能力发生位置
        self.偏置=偏置
        self.P_n=公称压力#n
    def 位移方程(self,x):#x0=角度1，x2位移
        return np.array([self.曲柄长度*np.sin(self.thea)+self.连杆长度*np.sin(x[0]), \
                         self.曲柄长度*np.cos(self.thea)+self.连杆长度*np.cos(x[0])-x[1]])
    def 解方程(self):
        sol3_fsolve = fsolve(self.位移方程,self.初始)
        return sol3_fsolve
    def 求解位移(self):
        数据=pd.DataFrame()
        角度=np.linspace(np.pi,-np.pi,10001)
        位移=np.linspace(0,2*np.pi,10001)
        时间=np.linspace(0,2*np.pi/self.角速度,10001)#时间
        for i in range(len(角度)):
            self.thea=角度[i]
            shuju=self.解方程()
            self.初始=shuju
            位移[i]=shuju[1]
        #最大位移=数据['位移'].max()
        滑块速度=-np.gradient(位移,时间,edge_order=2)
        滑块加速度=np.gradient(滑块速度,时间,edge_order=2)
        数据['位移']=位移
        print(位移)
        最大位移=数据.loc[:,'位移'].max()
        数据['角度弧度']=角度
        数据['角度']=(np.pi-角度)/np.pi*180   
        数据['滑块速度']=滑块速度
        数据['滑块加速度']=滑块加速度
        数据['距离下死点位置']=最大位移-位移
        行程=max(数据['距离下死点位置'])
        stu = 数据.loc[数据['距离下死点位置'].apply(lambda a:self.sf<=a<=(self.sf+0.05))]
        stu=stu.loc[stu['滑块速度']<0,'滑块速度']
        stu=stu.min()
        v=abs(stu)
        pa=self.P_n*10000*v/1000
        Ms=pa/self.角速度
        Mq=Ms*1;#%偏心轴上的输入扭矩
        Pa=Mq*self.角速度*1000/(滑块速度*10000);
        数据['发生力']=-Pa
        数据.loc[数据['发生力']>self.P_n,'发生力']=self.P_n
        数据.loc[数据['发生力']<0,'发生力']=0
        return  Ms,数据,行程
    def 画图(self):
        dd=self.求解位移()
        ms=dd[0]
        绘图(dd,self.sf,self.P_n)
        dd[1].to_csv('../数据文件/曲柄连杆计算数据.txt', sep=' ', index=False)
        return ms
if __name__=='__main__':    
    曲柄滑块机构=曲柄滑块机构(曲柄长度=30,连杆长度=591,spm=140,能力发生位置=4,偏置=0,公称压力=80)
    #曲柄滑块机构=曲柄滑块机构()
    zz=曲柄滑块机构.求解位移()  
    曲柄滑块机构.画图()
#    sv.buildGUI(曲柄滑块机构.速度画图())